<?php
/**
 * Created by PhpStorm.
 * User: aron
 * Date: 2019/5/8
 * Time: 10:39 AM
 */

include_once "../../Util/DebugUtil/DebugUtil.php";

/***************** final 关键字修饰class和方法 ********************/

final class FinalClass {

}

// 编译错误：不能继承final修饰的类
//class ExtendsFinalClass extends  FinalClass {
//
//}

class FinalMethodClass {
    final function finalMethod(){

    }
}


class ExtendsFinalMethodClass extends FinalMethodClass {
    // 编译错误：不能重写final修饰的方法
//    function finalMethod(){
//
//    }
}

// Demo
$obj = new FinalClass();
//$obj = new ExtendsFinalClass();
echo "final 关键字修饰class和方法 END";
DebugUtil::printDebugSeperator();


/***************** static 关键字 ********************/
/***************** const 关键字 ********************/
class MyClass {

    const CONST_SERVER_NAME = "hello.server";

    // static 修饰的变量
    private static $instance;

    public $name;

    public function __construct($name = "")
    {
        $this->name = $name;
    }


    // static 修饰的方法，同时也是一个单例的对象的获取方法
    public static function getInstance()
    {
        if (!self::$instance) {
            self::$instance = new MyClass();
        }
        return self::$instance;
    }

    public function showServerName()
    {
        // 使用const常量 self::常量名称
        echo "Server Name = " . self::CONST_SERVER_NAME;
    }

    /**
     * 重写__clone方法
     */
    public function __clone()
    {
        $this->name = $this->name . " Copy";
    }

    public function say()
    {
        echo "名字是：$this->name";
        yt_debug_print_break_line();
    }

}

$obj = new MyClass("Car");
$obj->showServerName();

// instanceof 判断对象是否为某种类型
DebugUtil::printDebugSeperator();
if ($obj instanceof MyClass) {
    echo "obj 是 MyClass 的子类";
}

// clone 复制对象，两个对象是独立的，互不影响
DebugUtil::printDebugSeperator();
$clonedObj = clone($obj);
$obj->say();
$clonedObj->say();


DebugUtil::printDebugSeperator();

echo "END";